<?php

/**
 * User_RolesController
 * 
 * Управление ролями юзеров
 * 
 * @package   Basic
 * @author    Игорь Будасов aka Lord <igor.budasov@gmail.com> 
 * @copyright Игорь Будасов aka Lord <igor.budasov@gmail.com> 
 */
 
class User_RolesController extends Lord_Controller_Action 
{
	
/*------------------------------------------------------------------------------*/

	/**
	 * Индексный метод.
     * Отображает список всех ролей
	 */
	 
	public function indexAction()
	{
		$this->view->roles = $this->model->getRoles();
		
		return;
		
	}

/*------------------------------------------------------------------------------*/

	/**
	* Добавление роли
	*/
	
	public function addAction()
	{
		$this->_process('add');    
	}

/*------------------------------------------------------------------------------*/

	/**
	* Редактирование роли
	*/
	
	public function editAction()
	{
		// получаем данные для заполнения формы
		$model = new User(); 
		
		// достаем нужные данные
		$role = $model->getRole($this->_checkId());
		$preResources = $model->getSomeResources($this->_checkId());
		$resources = array();
        foreach($preResources as $res)
        {
			$resources[] = $res['res_id'];
        }
		  
		$data['name']        = $role['name'];
        $data['discount']    = $role['discount'];
		$data['description'] = $role['description'];
		$data['res']         = $resources;
		      
		// если в $data пусто - нам пытаются скормить что-то не то
		if(empty($data))
			return $this->view->assign('err', 'user_roles_edit_fail');
			
		// и отдаем на редактирование
		$this->_process('edit', $data);    
	}

/*------------------------------------------------------------------------------*/
 
	/**
	* Удаление роли
	*/
	
	function deleteAction()
	{
		// проверяем айдишник 
		$id = $this->_checkId(); 
		
		// отправляем данные в шаблон
		$this->view->role = $this->model->getRole($id);
		
		if ($this->_request->isPost()) 
		{    
			// если юзер подтвердил - удаляем
			if ($this->_request->getPost('conf') == 'ok') 
			{
				// удаляем саму роль
				$this->model->delRole($id);
				
				// удаляем все связанное с ролью из перекрестка
				$this->model->delCross($id);
			}
		} 
		else 
		{
			// если в $this->view->role пусто - нам пытаются скормить левый $id
			if(empty($this->view->role))
				return $this->view->err = 'user_roles_delete_fail';
			else
				return;
		}
		
		// возвращаемся на главную страницу
		return $this->_redirect('user/roles');
	}
	
/*==============================================================================*/

	/**
	* Приватный метод для обработки 
	* добавления и редактирования 
	* 
	* @param string $action
	* @param array $data
	* @return void
	*/

	private function _process($action = 'add', $data = array())
	{         
		// показываем форму
		$form = $this->_form($data, array(), $action);
		$this->view->form = $form; 
		
		// зачитываем конфиг				
		$config = $charset = $this->_helper->config();
				
		// валидация
		if (!empty($_POST)) 
		{
			if (!$form->isValid($_POST)) 
			{   
				// показываем сообщение об ошибке
				$this->view->err = 'form_fail';
				// получаем невалидные значения, введенные в форму         
				$values = $form->getUnfilteredValues(); 
				// получаем ошибки
				$errors = $form->getErrors(); 
				// показываем форму с невалидными данными
				return $this->view->form = $this->_form($values, $errors, $action);
			}
		}
		
		/**
		* обрабатываем форму
		*/
		// если к нам что-то пришло из поста
		if ($this->_request->isPost()) 
		{    
			// получаем корректные данные, введенные юзером
			$values = $form->getValues();
			
			// выбираем нужные данные для добавления
			$roleData['name']            = $values['name'];
            $roleData['discount']        = $values['discount'];             
			$roleData['description']     = $values['description'];			 
			
			// кладем в базу и на главную страницу модуля
			// или показываем сообщение о завершении процесса  
			if($action == 'add')
			{
				// добавляем данные о роли  в таблицу ролей
				$roleId = $this->model->addRole($roleData);

				// добавление данных в таблицу перекрестка полей и ресурсов				
				foreach($values['res'] as $res)
				{
					// ортируем массив
					$crossData['role_id'] = $roleId;
					$crossData['res_id']  = $res;
					
					// добавляем
					$this->model->addCross($crossData);
				}
				return $this->view->msg = 'user_roles_process_add_ok';
			}
			elseif($action == 'edit')
			{               
				// редактируем данные о роли 
				$this->model->updateRole($roleData, $values['id']);
                   
				// очищаем все предыдущие ресурсы для этой роли
				$this->model->delCross($values['id']);

				// добавляем обновленные данные о ресурсах и роли
				foreach($values['res'] as $res)
				{
					// ортируем массив
					$crossData['role_id'] = $values['id'];
					$crossData['res_id']  = $res;
					
					// кладем в базу новые ресурсы для роли
					$this->model->addCross($crossData);
				}
				// return $this->view->msg = 'user_roles_process_edit_ok';                
				return $this->_redirect('user/roles');
			}
		}        
	}
	
/*------------------------------------------------------------------------------*/

	/**
	* Приватный метод для проверки айдишника записи
	*/
	
	private function _checkId()
	{
		$id = $this->_getParam('id');
		 
		if( $id == false
			or $id == null
			or empty($id)
			or !isset($id))
		{
			return $this->_redirect('');
		}
		else
		{
			return (int)$id;
		}
	}

/*------------------------------------------------------------------------------*/

	/**
	* Приватный метод для построения формы
	* Используется при добавлении и редактировании
	* В качестве аргумента принимает уже заполненые 
	* данные (при редактировании)
	* 
	* @param $data array 
	* @param $errors array
	* @param $action string
	* @return object
	*/
	
	private function _form($data = array(), $errors = array(), $action = 'add')
	{    
		$form = new Lord_Form_Form();
		$form->setAction( '/' . $this->_moduleName.
						  '/' . $this->_controllerName.
						  '/' . $action
						  )
			 ->setMethod('post');  
		
		// кодировка	 
		$charset = $this->_helper->config()->common->charset;
		
		// ресурсы
		$preResources = $this->model->getResources();
		foreach($preResources as $res)
		{
			$resources[$res['id']] = 
					$res['module'].'/'.$res['controller'].'/'.$res['action'].' — ' . $res['description'];
		}
		
		// Название роли
		$name = new Lord_Form_Element_Text('name', array(
			'required'    => true,
			'label'       => $this->view->translate('user_roles_form_name'),
			'description' => $this->view->translate('user_roles_form_name_desc'),
			'maxlength'   => '250',
			'validators'  => array(
				array('StringLength', true, array(0, 250, $charset))
			),
			'value'       => (!empty($data['name'])) ? $data['name'] : '' 
		));
		$form->addElement($name); 

        // Описание роли
        $description = new Lord_Form_Element_Text('description', array(
            'required'    => true,
            'label'       => $this->view->translate('user_roles_form_description'),
            'description' => $this->view->translate('user_roles_form_description_desc'),
            'maxlength'   => '250',
            'validators'  => array(
                array('StringLength', true, array(0, 250, $charset))
            ),
            'value'       => (!empty($data['description'])) ? $data['description'] : '' 
        ));
        $form->addElement($description); 

		// Скидка для этого типа пользователей
		$discount = new Lord_Form_Element_Text('discount', array(
			'required'    => true,
			'label'       => $this->view->translate('user_roles_form_discount'),
			'description' => $this->view->translate('user_roles_form_discount_desc'),
			'maxlength'   => '3',
			'validators'  => array(
                array('StringLength', true, array(0, 3, $charset)),
                array('Int', true, array()),
				array('Between', true, array('min' => 0, 'max' => 100)),
			),
			'value'       => (!empty($data['discount'])) ? $data['discount'] : 0 
		));
		$form->addElement($discount); 

		// ресурсы      
		$res = new Zend_Form_Element_MultiCheckbox('res', array(
			'required'    => true,
			'multiOptions' => $resources,
			'label'       => $this->view->translate('user_roles_form_res'),
			'description' => $this->view->translate('user_roles_form_res_desc'),
            'value'       => (!empty($data['res'])) ? $data['res'] : $data = array()
		));
		$form->addElement($res); 
 	    
 	    // айдишник 
		$id = $form->createElement('hidden', 'id')
			->setValue(($action == 'edit') ? $this->_checkId() : 0);
		$form->addElement($id);
		
		// кнопка сабмита
		$form->addElement('submit', 
						 'login', 
						 array('label' => $this->view->translate('user_roles_form_submit')));
		
		// ошибки
		$this->_helper->FormErrors($errors, $form);
		
		return $form;
	} 
      
/*------------------------------------------------------------------------------*/

}
